package priv.conceit.study.book.thread.chapter1.parts4;

import java.util.concurrent.TimeUnit;

/**
 * 1.4
 * 第一章第四节
 * 线程的start 方法剖析
 * <p>
 * 在jvm源码中{@link Thread#start()}start方法会调用start0 jni方法启动线程。
 * 但是我们重写的run方法在{@link Thread}中完全找不到。
 * 在{@link Thread#start()}源码的注释中有这样一句
 * Causes this thread to begin execution; the Java Virtual Machine
 * calls the <code>run</code> method of this thread.
 * 意思是说 开始执行这个线程的时候，jvm会调用该线程的run方法，
 * 就是说start0 会调用run方法
 * <p>
 * 1-Thread 在new状态时 threadStart属性默认为0
 * 2-不能两次启动线程 否则会出现 {@link IllegalThreadStateException} 异常
 * 3-线程启动时 会将该线程加入一个ThreadGroup中 {@link ThreadGroup}
 * 4-线程如果生命周期结束(terminated),再次调用start方法是不被允许的
 * 也就是说terminated状态 不能进入runnable状态
 *
 * @author Conceit
 * @since 1.0.0, 2019/6/3
 */
public class ThreadStartMethodDissect {

	public static void main(String[] args) {
		//重复启动start方法(running状态)
		//repeatedStart();
		//线程正常终结 之后启动start方法
		terminatedLaterStart();

	}

	/**
	 * 重复启动线程
	 */
	public static void repeatedStart() {

		Thread thread = new Thread() {
			@Override
			public void run() {
				try {
					TimeUnit.SECONDS.sleep(2L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		thread.start();
		//重复启动
		thread.start();
	}

	/**
	 * 线程正常终结之后 重启线程
	 */
	public static void terminatedLaterStart() {
		Thread thread = new Thread() {
			@Override
			public void run() {
				try {
					TimeUnit.SECONDS.sleep(2L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		thread.start();
		System.out.println("当线程名-->" + thread.getName());

		try {
			//当前线程为main 线程 两个方法一样
			//不是在线程 run方法里写的不是
			//TimeUnit.SECONDS.sleep(4L);
			Thread.sleep(4000);
			System.out.println("当线程名-->" + Thread.currentThread().getName());
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		thread.start();
		System.out.println("当线程名-->" + thread.getName());
	}

}
